<?php
// 设置编码格式
header('Content-Type: text/html; charset=utf-8');

define('IN_TG', true);
// 引入公共文件
require_once('../../dream_include/common.inc.php');
// 小程序api接口验证文件
require ROOT_PATH . 'dream_include/mini_api_func.php';

// 访问api页面的来源验证
url_source_chk();

// 声明CODE，获取小程序传过来的用于换取openid、session_key 的 CODE
$code = _get_isset('code');
if (!$code) {
    echo "{\"errCode\":\"1001\",\"errMsg\":\"请重新打开小程序\"}";
    exit();
}
$code = htmlspecialchars($code);
$signstr = _get_isset('signstr');  // 等于dream_ren_3016
if ($signstr != 'dream_ren_3016') {
    echo "{\"errCode\":\"1001\",\"errMsg\":\"来源错误\"}";
    exit();
}

// $port_code = _get_isset('port_code');  // 第一次邀请QR网点编码
$invite_openid = _get_isset('invite_openid');  // 第一次邀请openid


// 配置appid
$appid = "wx90c91a69106......";
// 配置appscret
$secret = "c9fa0ee716d2cdaf0ee......";
// api接口 获取openid和session_key
$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
// 发送
$data_str = curl_get_https($api);

// 将获取到的 $data_str 转为数组 $change_new_arr ，后写入或更新数据库（session_key说是不能用小程序传递，所以单独记录在数据库，用于解码手机号是使用）
$change_new_arr = json_decode($data_str, JSON_OBJECT_AS_ARRAY);
// 如果 $change_new_arr['errcode'] 存在就是出错了，返回原数据并结束程序，正确时 errcode 为 0 。
if ($change_new_arr['errcode']) {
    return $data_str;
    exit;
}
// 如果返回的数据中没有openid就结束
if (!$change_new_arr['openid']) {
    return $data_str;
    exit;
}
// 如果返回的数据中没有session_key就结束
if (!$change_new_arr['session_key']) {
    return $data_str;
    exit;
}

// 为用户分配usr_sign,小程序验证用户身份时链接此文件，并更新usr_sign
// （action、open_id、dmf、expt）openssl方式秘钥，小程序每次登录时生成新秘钥。
// 小程序页面每次从服务器接口获取数据时传递此chk_signature，服务器收到后解码，再验证action和openid是否一致
$sign_arr = [
    "action" => 'dream_mini', // 返回修改页面需要验证的其中一个参数（不是保存页面的验证参数）
    "open_id" => $change_new_arr['openid'], // 文章id
    "dmf" => $_SERVER["SERVER_NAME"], // 域名
    "expt" => time() + 8640000, // 当前时间加上100天
];
$cry = new OpensslCrypt(); // 引入OpensslCrypt类
$chk_signature = $cry->enc($sign_arr);

// 初始化 $usr_all_info 中的字段 satrt
$usr_all_info = array();
$usr_all_info['usr_id'] = 0;
$usr_all_info['usr_name'] = '';
$usr_all_info['usr_phone'] = '';
// 初始化 $usr_all_info 中的字段 satrt

// 开始写入或更新session_key到数据库
$dbconn = new DbMysql();
$usr_Res = $dbconn->sql_fetch_assoc("SELECT usr_id,wx_usr_phone,reg_usr_name FROM resource_wechat_user_library WHERE wx_openid='" . $change_new_arr['openid'] . "' LIMIT 1");
if ($usr_Res) {

    $usr_all_info['usr_id'] = $usr_Res['usr_id'];
    if ($usr_Res['wx_usr_phone']) {
        // 如果手机号存在，将“ wx_usr_phone ”写入 “ usr_phone ”手机号
        $change_new_arr['usr_phone'] = $usr_Res['wx_usr_phone'];
        // 如果手机号存在，姓名也存在，写入usr_all_info 数组信息
        // if ($usr_Res['reg_usr_name']) {
        $usr_all_info['usr_name'] = $usr_Res['reg_usr_name'];
        $usr_all_info['usr_phone'] = $usr_Res['wx_usr_phone'];
        // }
    }
    // 存在openid就更新 session_key
    $_newinfo = array();
    $_newinfo['wx_session_key'] = $change_new_arr['session_key'];
    $_newinfo['modify_time'] = date("Y-m-d H:i:s");
    $_newinfo['modify_ip'] = getip();
    $_newinfo['chk_signature'] = $chk_signature;
    // 执行修改数据库
    $_where = "wx_openid = '" . $change_new_arr['openid'] . "'";
    $result1 = $dbconn->upWhereArr($_newinfo, 'resource_wechat_user_library', $_where);
    // 不管更新是否成功，关闭数据库
    $dbconn->dbClose();
} else {
    // 不存在openid就添加一条数据
    $_newinfo = array();

    // $_newinfo['port_code'] = $port_code; // 第一次邀请QR网点编码
    $_newinfo['invite_openid'] = $invite_openid; // 第一次邀请openid

    $_newinfo['wx_openid'] = $change_new_arr['openid'];
    $_newinfo['wx_session_key'] = $change_new_arr['session_key'];
    $_newinfo['add_time'] = date("Y-m-d H:i:s");
    $_newinfo['add_ip'] = getip();
    // 查询ip对应地区
    // $ips = new IPtoRegion();
    // $_newinfo['IPtoCitySelf'] = $ips->show($_newinfo['add_ip'], 2);
    // ip对应地区结束
    $_newinfo['modify_time'] = date("Y-m-d H:i:s");
    $_newinfo['modify_ip'] = getip();
    $_newinfo['chk_signature'] = $chk_signature;
    $_newinfo['isdeleted'] = 0;
    $_newinfo['check_onlycode'] = 'DREAMREN';
    $_newinfo['valid_code'] = _ran6n();
    $result2 = $dbconn->insertArr($_newinfo, "resource_wechat_user_library");
    // 不管添加是否成功，关闭数据库
    $dbconn->dbClose();

    $usr_all_info['usr_id'] = $result2[1];
}

// 写入usr_all_info
$change_new_arr['usr_all_info'] = $usr_all_info;
$change_new_arr['usr_sign'] = $chk_signature;
unset($change_new_arr['session_key']); // 删除session_key

$new_data_str = json_encode($change_new_arr);
// 写库完成，返回wx接口的原始数据+sign。
echo $new_data_str;





// 获取GET请求
function curl_get_https($url)
{
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    //设置是否输出header
    curl_setopt($curl, CURLOPT_HEADER, false);
    //设置是否输出结果
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //设置是否检查服务器端的证书
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    //     curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    //     curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    //使用curl_exec()将curl返回的结果转换成正常数据并保存到一个变量中
    $data = curl_exec($curl);
    //关闭会话
    curl_close($curl);
    // 返回获取结果为JSON字符串
    return $data;
}



// //写入log日志，记录安全隐患
// function slog($logs)
// {
//     $toppath = "visit.txt";
//     // $toppath = "E:\safelog\dendn38n2b.txt";
//     $Ts = fopen($toppath, "ab+");
//     fwrite($Ts, $logs . "\r\n\r\n");
//     fclose($Ts);
// }
